﻿using System;
using System.Collections.Generic;
using System.Web.Mvc;
using ControleRepresentante.Logic.Models;
using ControleRepresentante.Logic.Repositories;
using WebSite.Controllers.ControllerExtensions;
using WebSite.ViewModels.EditViewModels;
using Attribute = ControleRepresentante.Logic.Models.Attribute;

namespace WebSite.Controllers
{
    public class ConfiguracoesController : ControllerBase<IRepresentanteRepository>
    {
        public ConfiguracoesController(IRepositoryProvider repositoryProvider, IControllerExtensionProvider controllerExtensionProvider)
            : base(repositoryProvider, controllerExtensionProvider)
        {
        }

        public ActionResult Edit()
        {
            EnsureHasPermission(Operacao.Update);
            IEnumerable<Attribute> attributes = RepositoryProvider.GetRepository<IAttributeRepository>().GetAttributesByType(AttributeType.Vendedor);
            return View(new ConfiguracoesEditViewModel(Repository.GetRepresentante().RepresentanteInfo, attributes));
        }

        protected override Area? Area { get { return ControleRepresentante.Logic.Models.Area.Configuracoes; } }

        public ActionResult Details()
        {
            EnsureHasPermission(Operacao.View);
            return View(Repository.GetRepresentante().RepresentanteInfo);
        }

        [HttpPost]
        public ActionResult Edit(string nomePedido, string infoPedido, Guid? vendedorPedidoAttributeId)
        {
            EnsureHasPermission(Operacao.Update);
            RepresentanteInfo representanteInfo = Repository.GetRepresentante().RepresentanteInfo;
            IAttributeRepository attributeRepository = RepositoryProvider.GetRepository<IAttributeRepository>();
            Attribute vendedorPedidoAttribute = null;
            if (vendedorPedidoAttributeId.HasValue)
            {
                vendedorPedidoAttribute =
                    attributeRepository
                        .GetModelById(vendedorPedidoAttributeId.Value);
            }
            if (TryUpdateRepresentanteInfo(representanteInfo, nomePedido, infoPedido, vendedorPedidoAttribute))
            {
                Repository.UpdateRepresentanteInfo(representanteInfo);
                return RedirectToAction("Details");
            }
            IEnumerable<Attribute> attributes = attributeRepository.GetAttributesByType(AttributeType.Vendedor);
            return View(new ConfiguracoesEditViewModel(representanteInfo, attributes));
        }

        private bool TryUpdateRepresentanteInfo(RepresentanteInfo representanteInfo, string nomePedido, string infoPedido, Attribute vendedorPedidoAttribute)
        {
            representanteInfo.NomePedido = nomePedido;
            representanteInfo.InfoPedido = infoPedido;
            representanteInfo.VendedorPedidoAttribute = vendedorPedidoAttribute;
            ModelState.Clear();

            if (String.IsNullOrEmpty(representanteInfo.NomePedido) ||
                representanteInfo.NomePedido.Trim() == String.Empty)
            {
                ModelState.AddModelError("NomePedido", "*");
            }
            return ModelState.IsValid;
        }
    }
}
